#include <iostream>
#include <pthread.h>
#include <unistd.h>

using namespace std;
int num = 0;

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

void* threadfuncA(void* args)
{
    const char* s = static_cast<const char*>(args);
    while(true) 
    {
        pthread_mutex_lock(&mutex);
        if(num % 2 != 0) pthread_cond_wait(&cond,&mutex);
        else
        {
            cout<<s<<"打印"<<endl;
            pthread_cond_signal(&cond);
            ++num;
        }
        pthread_mutex_unlock(&mutex);
        sleep(1);

    }
    return nullptr;
}

void* threadfuncB(void* args)
{
    const char* s = static_cast<const char*>(args);
    while(true) 
    {
        pthread_mutex_lock(&mutex);
        if(num % 2 == 0) pthread_cond_wait(&cond,&mutex);
        else
        {
            cout<<s<<"打印"<<endl;
            pthread_cond_signal(&cond);
            ++num;
        }
        pthread_mutex_unlock(&mutex);
        sleep(2);

    }
    return nullptr;
}

int main()
{
    const char* A = "线程A";
    const char* B = "线程B";
    pthread_t t1,t2;
    pthread_create(&t1,nullptr,threadfuncA,(void*)A);
    pthread_create(&t2,nullptr,threadfuncB,(void*)B);

    pthread_join(t1,nullptr);
    pthread_join(t2,nullptr);

    return 0;
}











// void* func(void* args)
// {
//     char* str = static_cast<char*>(args);
//     while(true)
//     {
//         pthread_mutex_lock(&mutex); //申请访问
//         pthread_cond_wait(&cond,&mutex); //访问环境变量 如果没有资源则挂起
//         cout<<str<<"运行..."<<endl;
//         pthread_mutex_unlock(&mutex); //释放锁
//     }
//     delete[] str;
//     return nullptr;
// }

// int main()
// {
//     pthread_t arrt[5];
//     for(int i = 0;i<5;++i)
//     {
//         char* str = new char[64];
//         snprintf(str,64,"%s%d","thread-",i+1);
//         pthread_create(arrt+i,nullptr,func,(void*)str);
//     }

//     sleep(3);

//     while(true)
//     {
//         //pthread_cond_signal(&cond); //一个一个唤醒线程
//         pthread_cond_broadcast(&cond); //一次唤醒所有等待线程
//         cout<<"释放条件变量!"<<endl;
//         sleep(1);
//     }

//     for(int i = 0;i<5;++i)
//     {
//         pthread_join(*(arrt+i),nullptr);
//     }

//     return 0;
// }